/*
  名称: TableStyle
  描述: 类似 CRM 主列表斑马线样式、外漏筛选状态记录
  注意: 必须 增加 watch: selectedData 如代码内注释逻辑
  用法: customTableStyleClass
*/
import { adminConfigSetCustomSettingAPI, adminConfigQueryCustomSettingAPI } from '@/api/admin/config'
import { isArray, isObject } from '@/utils/types'
import merge from '@/utils/merge'

export default {
  data() {
    return {
      tableStyleObj: {
        init: false, // 通过网络请求赋值之后的 tableStyleObj， watch 方法执行更新
        stripe: true, // 斑马纹
        bottomBorderShow: true,
        rightBorderShow: true,
        viewType: '1' // 目前商机用 1 是表格 2 是列
      },
      tableStyleClassModuleKey: '', // 当前模块的存储key
      tableStyleCustomConfig: {} // 当前模块的自定义配置 目前包含 tableStyleObj  filterConfig
    }
  },
  computed: {
    // 使用这个合并后的
    customTableStyleClass() {
      const arr = []
      arr.push(...this.tableStyleClass)
      arr.push('is-filter-table')
      return arr
    },

    tableStyleClass() {
      const arr = []
      if (this.tableStyleObj && this.tableStyleObj.rightBorderShow === false) {
        arr.push('is-no-right-border-style')
      }
      if (this.tableStyleObj && this.tableStyleObj.bottomBorderShow === false) {
        arr.push('is-no-bottom-border-style')
      }
      return arr
    }
  },
  watch: {
    // 表格样式对象
    tableStyleObj: {
      handler(newVal, oldVal) {
        if (oldVal && newVal && oldVal.init && newVal.init) {
          // 都含有init 为true 标识，是请求获取后的styleObj被修改
          this.tableStyleUpdateClass()
        }
      },
      deep: true
    }
  },
  methods: {
    /**
     * @description: 获取配置
     * @param {*} moduleKey 对应模块数据的存储key
     * @return {*}
     */
    tableStyleGetCustomConfig(moduleKey) {
      this.tableStyleClassModuleKey = moduleKey
      return new Promise((resolve, reject) => {
        adminConfigQueryCustomSettingAPI(moduleKey).then(res => {
          const resData = res.data
          if (isArray(resData) && resData.length > 0) {
            const config = resData[0] // 值规范是数组 所以默认放在第一个元素里
            if (isObject(config)) {
              if (config.tableStyleObj) {
                // 请求后 将styleObj init 设置为true, 只有针对该对象的修改，才会发请求
                config.tableStyleObj.init = true
                this.tableStyleObj = merge({ ...this.tableStyleObj }, config.tableStyleObj || {})
              }
              this.tableStyleCustomConfig = config
              resolve && resolve(config)
            }
          }
          if (!this.tableStyleObj.init) {
            this.$set(this.tableStyleObj, 'init', true)
          }
        }).catch(e => {
          reject && reject(e)
        })
      })
    },

    /**
     * @description: 更新style样式
     * @param {*} moduleKey 对应模块数据的存储key
     * @param {*} otherConfig
     * @return {*}
     */
    tableStyleUpdateClass(moduleKey, otherConfig) {
      return new Promise((resolve, reject) => {
        const updateKey = moduleKey || this.tableStyleClassModuleKey
        if (!updateKey) {
          if (reject) reject(new Error('moduleKey is required'))
          return
        }
        adminConfigSetCustomSettingAPI(updateKey, [{
          ...this.tableStyleCustomConfig,
          tableStyleObj: this.tableStyleObj,
          ...(otherConfig || {})
        }]).then(res => {
          resolve && resolve(res)
        }).catch(e => {
          reject && reject(e)
        })
      })
    }
  }
}
